"""
Python文件路径操作：掌握文件和目录管理

Python提供了多种处理文件路径的方式，主要包括：
1. os模块：提供了基本的文件和目录操作功能
2. glob模块：提供了更为现代和简便的文件遍历方法
"""

import os
import glob
import shutil  # 用于高级文件操作

print("="*60)
print("Python文件路径操作")
print("="*60)

# =============== 1. os模块的常见操作 ===============

print("\n1. os模块的常见操作")
print("-"*40)

# -------- 1.1 获取当前工作目录 --------
print("1.1 获取当前工作目录:")
current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")

# -------- 1.2 检查路径是否存在 --------
print("\n1.2 检查路径是否存在:")
path_to_check = "example_folder"  # 一个示例路径
exists = os.path.exists(path_to_check)
print(f"路径 '{path_to_check}' 是否存在: {exists}")

# -------- 1.3 创建目录 --------
print("\n1.3 创建目录:")
try:
    # 创建一个新目录
    os.mkdir("example_folder")
    print("成功创建目录 'example_folder'")
    
    # 创建嵌套的目录结构，这个用法更加现代，可以一次性创建多重子目录，推荐使用
    os.makedirs("example_folder/subfolder/subsubfolder", exist_ok=True)
    print("成功创建嵌套目录结构")
except FileExistsError:
    print("目录已存在")
except Exception as e:
    print(f"创建目录时出错: {e}")

# -------- 1.4 改变工作目录 --------
print("\n1.4 改变工作目录:")
try:
    # 保存原始目录以便稍后恢复
    original_dir = os.getcwd()
    
    # 改变到新创建的目录
    os.chdir("example_folder")
    print(f"当前工作目录已改变为: {os.getcwd()}")
    
    # 恢复原始目录
    os.chdir(original_dir)
    print(f"已恢复到原始目录: {os.getcwd()}")
except Exception as e:
    print(f"改变目录时出错: {e}")

# -------- 1.5 列出目录内容 --------
print("\n1.5 列出目录内容:")
try:
    # 创建一些测试文件
    with open("example_folder/test1.txt", "w") as f:
        f.write("这是测试文件1")
    with open("example_folder/test2.txt", "w") as f:
        f.write("这是测试文件2")
    with open("example_folder/test.py", "w") as f:
        f.write("print('这是Python测试文件')")
    
    # 列出目录内容
    dir_contents = os.listdir("example_folder")
    print("'example_folder'目录内容:")
    for item in dir_contents:
        print(f"  - {item}")
except Exception as e:
    print(f"列出目录内容时出错: {e}")

# -------- 1.6 路径拼接 --------
print("\n1.6 路径拼接:")
# 不同操作系统的路径分隔符不同，Windows使用'\'，Unix/Linux使用'/'
# os.path.join()会根据操作系统自动选择正确的分隔符
path1 = os.path.join("example_folder", "subfolder", "file.txt")
print(f"拼接路径结果: {path1}")

# 错误的手动拼接方式（不推荐）
incorrect_path = "example_folder" + "/" + "subfolder" + "/" + "file.txt"
print(f"手动拼接（不推荐）: {incorrect_path}")
print("注意: 手动拼接可能在不同操作系统上出现问题")

# -------- 1.7 获取文件信息 --------
print("\n1.7 获取文件信息:")
test_file = "example_folder/test1.txt"
if os.path.exists(test_file):
    # 获取基本文件信息
    print(f"文件大小: {os.path.getsize(test_file)} 字节")
    print(f"是否为文件: {os.path.isfile(test_file)}")
    print(f"是否为目录: {os.path.isdir(test_file)}")
    print(f"文件名: {os.path.basename(test_file)}")
    print(f"目录名: {os.path.dirname(test_file)}")
    
    # 分离路径和文件名
    dir_name, file_name = os.path.split(test_file)
    print(f"路径拆分 - 目录: {dir_name}, 文件名: {file_name}")
    
    # 分离文件名和扩展名
    name_without_ext, ext = os.path.splitext(file_name)
    print(f"文件名拆分 - 不带扩展名: {name_without_ext}, 扩展名: {ext}")

# -------- 1.8 获取绝对路径 --------
print("\n1.8 获取绝对路径:")
relative_path = "example_folder/test1.txt"
absolute_path = os.path.abspath(relative_path)
print(f"相对路径: {relative_path}")
print(f"绝对路径: {absolute_path}")

# =============== 2. glob模块：文件遍历进阶 ===============

print("\n2. glob模块：文件遍历进阶")
print("-"*40)

# -------- 2.1 基本的文件匹配 --------
print("2.1 基本的文件匹配:")
# 查找特定目录下的所有文件
all_files = glob.glob("example_folder/*")
print("使用glob查找'example_folder'中的所有文件:")
for file in all_files:
    print(f"  - {file}")

# -------- 2.2 使用通配符 --------
print("\n2.2 使用通配符:")
# 只查找.txt文件
txt_files = glob.glob("example_folder/*.txt")
print("所有.txt文件:")
for file in txt_files:
    print(f"  - {file}")

# 只查找.py文件
py_files = glob.glob("example_folder/*.py")
print("\n所有.py文件:")
for file in py_files:
    print(f"  - {file}")

# -------- 2.3 递归搜索 --------
print("\n2.3 递归搜索:")
# 创建更深层次的测试文件
with open("example_folder/subfolder/deep_test.txt", "w") as f:
    f.write("这是深层目录中的测试文件")

# 递归搜索所有.txt文件 (Python 3.5+)
all_txt_recursive = glob.glob("example_folder/**/*.txt", recursive=True)
print("递归搜索所有.txt文件:")
for file in all_txt_recursive:
    print(f"  - {file}")

# -------- 2.4 复杂模式匹配 --------
print("\n2.4 复杂模式匹配:")
# 使用字符集匹配
test_files = glob.glob("example_folder/test[1-2].txt")
print("匹配'test1.txt'和'test2.txt':")
for file in test_files:
    print(f"  - {file}")

# =============== 3. 高级文件操作和清理 ===============

print("\n3. 高级文件操作和清理")
print("-"*40)

# -------- 3.1 使用shutil进行高级文件操作 --------
print("3.1 使用shutil进行高级文件操作:")

# 拷贝文件
try:
    source = "example_folder/test1.txt"
    destination = "example_folder/test1_copy.txt"
    shutil.copy2(source, destination)
    print(f"文件复制成功: {source} -> {destination}")
except Exception as e:
    print(f"复制文件时出错: {e}")

# -------- 3.2 清理示例文件和目录(可选) --------
print("\n3.2 清理示例文件和目录:")
print("注意: 在实际应用中，请谨慎使用删除操作!")

cleanup = True  # 设置为False可以保留示例文件
if cleanup:
    try:
        print("正在清理...")
        # 删除整个目录树
        if os.path.exists("example_folder"):
            # 删除目录树，这种删除方式不管目录中是否有内容，都会删除
            shutil.rmtree("example_folder")
            print("已删除'example_folder'及其内容")
            
    except Exception as e:
        print(f"清理文件时出错: {e}")
else:
    print("跳过清理步骤，示例文件和目录将保留")

# =============== 总结 ===============

print("\n" + "="*60)
print("总结：文件路径操作")
print("-"*40)
print("""
1. os模块提供了基本的文件和目录操作:
   - os.getcwd(): 获取当前工作目录
   - os.chdir(): 改变工作目录
   - os.path.exists(): 检查路径是否存在
   - os.mkdir() / os.makedirs(): 创建目录/嵌套目录
   - os.listdir(): 列出目录内容
   - os.path.join(): 安全地拼接路径
   - os.path.getsize(), isfile(), isdir(): 获取文件信息
   - os.path.split(), splitext(): 路径和文件名分离

2. glob模块提供了更为现代和简洁的文件遍历方法:
   - glob.glob(): 文件匹配和查找
   - 支持通配符 * 和 ? 以及字符集 [a-z]
   - 支持递归搜索 **

3. 高级文件操作:
   - shutil模块提供了更高级的文件操作 
   - 复制、移动、删除文件和目录树
""")

print("\n文件路径操作是Python文件管理的基础，掌握这些技能可以让你更高效地管理AI项目中的数据和资源。")
print("="*60)
